Google Cloud Batch で外部からのアクセスを遮断する

Google Cloud Batch で外部からのアクセスを遮断する

Clock Icon2024.11.07

Google Cloud データエンジニアのはんざわです。

見落としがちですが、Batch を利用する際には、ネットワークセキュリティに関して注意すべきポイントがあります。
本ブログでは、その注意点と回避方法について紹介したいと思います。

Batch におけるネットワークセキュリティの注意点

https://cloud.google.com/batch/docs/job-without-external-access?hl=ja

Batch では、VPC やサブネットなどの設定項目を明示的に指定しなかった場合、以下の2点の問題が発生します。

  1. 外部 IP が付与される
  2. default のネットワークが使用される

試しに、以下のジョブ構成で5分間 Sleep する Batch ジョブを作成し、Compute Engine の様子を確認してみましょう。

job.json
{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "script": {
                            "text": "sleep 5m"
                        }
                    }
                ]
            }
        }
    ],
    "allocationPolicy": {
        "location": {
            "allowedLocations": [
                "regions/asia-northeast1"
            ]
        },
        "instances": [
            {
                "policy": {
                    "machineType": "e2-micro",
                    "provisioningModel": "STANDARD"
                }
            }

        ],
        "serviceAccount": {
            "email": "sa-batch@<PROJECT_ID>.iam.gserviceaccount.com"
        }
    },
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

Compute Engine のコンソールから Batch が作成した VM インスタンスを確認できます。
以下のキャプチャからも分かるとおり、外部 IP が付与され、さらに default のネットワークが使用されていることが確認できます。

スクリーンショット 2024-11-06 17.11.20

default のネットワークを使用すると、デフォルトのファイアウォールルールが適用されてしまいます。
デフォルトのファイアウォールルールは、必要以上のポートが広く開放されているため、セキュリティ上のリスクがあります。
加えて、外部 IP も付与されているため、不正アクセスのリスクが高まったり、攻撃の対象となる可能性があります。

さらに、Google Cloud のベストプラクティスでも default の VPC ネットワークの使用は、非推奨となっています。

参考:カスタムモードの VPC ネットワークを使用する

対応策

対応策として、VPC やサブネットの設定項目を明示的に指定するようにしましょう。

具体的には、以下の設定項目を埋めることで、セキュリティリスクを低減できます。

{
  "network": string, # カスタムモードのVPCネットワーク
  "subnetwork": string, # 限定公開のGoogleアクセスを有効にしたサブネット
  "noExternalIpAddress": boolean # Trueで外部IPアドレスを持たせない
}

参考:NetworkInterface

やってみる

ここからは実際にネットワークの設定をした Batch のジョブを作成したいと思います。
今回やりたいことは、以下のとおりです。

  • カスタムモードの VPC ネットワークを作成する
  • 作成した VPC 内に限定公開の Google アクセスを有効にしたサブネットを作成する
  • 作成した VPC とサブネットを指定した上で外部 IP を持たせない Batch のジョブを作成する

事前準備

一部のリソースは、前回までの検証で使用したものを再利用します。

  • Batch のジョブを実行するサービスアカウント

https://dev.classmethod.jp/articles/google-cloud-batch-script-mount-cloud-storage/

1. カスタムモードの VPC ネットワークの作成

以下のコマンドで、カスタムモードの VPC ネットワークを作成します。

gcloud compute networks create vpc-batch \
    --subnet-mode=custom

参考

2. 限定公開の Google アクセスを有効にしたサブネットの作成

以下のコマンドで、限定公開の Google アクセスを有効にしたサブネットを作成します。

gcloud compute networks subnets create subnet-batch \
    --region=asia-northeast1 \
    --network=vpc-batch \
    --range=10.10.0.0/24 \
    --enable-private-ip-google-access

これにより、このサブネット内のリソースは、外部 IP アドレスを使用せずに Cloud Storage などの他の Google Cloud サービスにアクセスできるようになります。
今回の検証では必須ではありませんが、Batch ジョブなどで他の Google Cloud サービスにアクセスする必要がある場合は、このサブネットを使用してください。

参考

3. Batch

https://cloud.google.com/batch/docs/reference/rest/v1/projects.locations.jobs

最後に Batch のジョブの定義ファイルを準備します。
上記で作成したジョブ構成とほとんど同じですが、異なる部分だけハイライトしています。
前述したとおり、allocationPolicy.network.networkInterfaces の項目に必要な情報を入力しています。

job.json
{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "script": {
                            "text": "sleep 5m"
                        }
                    }
                ]
            }
        }
    ],
    "allocationPolicy": {
        "location": {
            "allowedLocations": [
                "regions/asia-northeast1"
            ]
        },
        "instances": [
            {
                "policy": {
                    "machineType": "e2-micro",
                    "provisioningModel": "STANDARD"
                }
            }

        ],
        "serviceAccount": {
            "email": "sa-batch@<PROJECT_ID>.iam.gserviceaccount.com"
        },
+       "network": {
+           "networkInterfaces": [
+               {
+                   "network": "projects/<PROJECT_ID>/global/networks/vpc-batch",
+                   "subnetwork": "projects/<PROJECT_ID>/regions/asia-northeast1/subnetworks/subnet-batch",
+                   "noExternalIpAddress": true
+               }
+           ]
+       }
    },
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

動かしてみる

以下のコマンドで、Batch ジョブを実行します。

gcloud beta batch jobs submit \
    --location asia-northeast1 \
    --config ./job.json

Batch ジョブの実行中に Compute Engine のコンソールを確認すると、外部 IP がなく先ほど作成した VPC が選択されている VM が確認できました。
このような構成にすることで、よりセキュアな Batch ジョブを実行することが可能です。

スクリーンショット 2024-11-07 20.53.59

まとめ

今回のブログでは、Batch で外部からのアクセスを遮断する方法を紹介しました。
意外と見落としがちな設定ですが、ネットワークセキュリティの観点から非常に重要だと思われます。
Batch を使用する際には、十分気を付けてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.